package com.ce.util;

import java.util.Enumeration;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.ce.framework.constants.WebConstants;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.StringUtil;
import com.ce.sys.login.model.User;
import com.ce.sys.person.dao.po.SysPerson;

/**
* 嫦娥软件有限公司 版权所有 2013
* 创建人：andy
* 创建日期：2010-11-3
* 创建时间：下午12:13:28
* 功能描述：集成了对Session操作的方法
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class SessionUtil {
	
	/** 存储当前登录用户信息 */
	public static final String LOGIN_USER = "LOGIN_USER";

	/** 存储信息发布前台门户ID */
	public static final String INFO_PORTAL_ORG = "INFO_PORTAL_ORG";

	/** 存储信息发布后台栏目的主机构 */
	public static final String INFO_CONFIG_ORG = "INFO_CONFIG_ORG";
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-3  下午12:10:47
	* 功能描述: 获取SESSION中存储的字符串
	* 方法的参数和返回值: 
	* @param name
	* @return
	*/
	public static String getAttr(String name){
		return (String)getAttribute(name);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-11-3  下午12:11:56
	* 功能描述: 获取SESSION中存储的对象
	* 方法的参数和返回值: 
	* @param name
	* @return
	*/
	public static Object getAttribute(String name){
		HttpServletRequest req = ServletActionContext.getRequest();
		if(req!=null){
			HttpSession session = req.getSession();
			if(session!=null)
				return (String)session.getAttribute(name);
		}
		return null;
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-11-3  下午12:11:12
	* 功能描述: 将确定的值存入SESSION
	* 方法的参数和返回值: 
	* @param name
	* @param value
	*/
	public static void setAttribute(String name,Object value){
		HttpServletRequest req = ServletActionContext.getRequest();
		if(req!=null){
			HttpSession session = req.getSession();
			if(session!=null)
				session.setAttribute(name,value);
		}
//		Enumeration<String> s= req.getSession().getAttributeNames();
//		while(s.hasMoreElements()){
//			   String elementName = s.nextElement();
//			   System.out.println("====set====="+elementName+":"+req.getSession().getAttribute(elementName));
//			  }
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-4-13 下午01:08:38
	 * 功能描述：根据传递的sessionid字符串在数据库中获取匹配的用户id，并将用户信息存入session
	 * 方法的参数和返回值
	 * @param userid
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	static public User initSessionUser(String userid ,HttpServletRequest request,HttpServletResponse response){
		User user = null;
		 try{
			 if(!"super".equals(userid)){
				 //存入非超管用户的session信息
					SysPerson person = (SysPerson)DbUtil.getPOByPk("com.ce.sys.person.dao.po.SysPerson", userid);
					if(person==null){
						throw new AppException("找不到ID为["+userid+"]的用户！");
					}
					//如果根据ID查询出的人员信息中，删除标记设置为0或没有设置为系统用户时，查询系统中是否存在同机构下相同姓名且状态正常的人员信息
					if("1".equals(""+person.getVcDelFlag())||StringUtil.isBlank(person.getVcLogName())){
						String id = DbUtil.getFirstStringSqlQuery("select vc_id from sys_t_person where vc_del$flag=0 " +
								"and vc_log$name is not null and vc_org$id=? and vc_name=?",new Object[]{person.getVcOrgId(),person.getVcName()});
						if(StringUtil.isNotBlank(id)){
							person = (SysPerson)DbUtil.getPOByPk("com.ce.sys.person.dao.po.SysPerson", id);
						}
						else{//如果查不到相应的用户，则不允许登录！
							throw new AppException("用户名["+person.getVcName()+"]不存在！");
						}
					}
					user = new User(person);
					//将每页显示行数的信息写入SESSION中
					request.getSession().setAttribute(WebConstants.SEARCH_PAGE_SIZE_FLDNAME, user.getRegeditValue(WebConstants.ROWS_PER_PAGE));
					request.getSession().setAttribute(User.USER_SESSION_ID, user);
			 }else{
				 user = User.setSuperUserInfo(request,OrgUtil.getRootOrgId());
			 }
		 }catch(Exception e){
			 e.printStackTrace();
		 }
		 //解决IFRAME中SESSION无法保留的代码.针对IE的解决方案，firefox下正常。（妈的，为解决这个问题搞了一下午时间！）
		 response.addHeader("P3P","CP=CAO PSA OUR"); 
		 return user;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-4-13 下午01:40:07
	 * 功能描述： 将sessionid存入数据库,以便供其他应用同步session信息
	 * 方法的参数和返回值
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	static public void saveSessionId(){
		HttpServletRequest req = ServletActionContext.getRequest();
		if(req!=null){
			HttpSession session = req.getSession();
			if(session!=null){
				DbUtil.executeSqlUpdate("insert into SYS_T_SESSION$INF  (SESSION_ID,SESSION_VALUE) values ('"+session.getId()+"','"+User.getUser(req).getVcId()+"')");
			}
		}
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-4-13 下午01:42:21
	 * 功能描述：删除数据库中对应的sessionid记录,在用户退出或session失效时调用该方法
	 * 方法的参数和返回值
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	static public void delSessionId(String sessionId){
		if(StringUtil.isNotBlank(sessionId)){
			DbUtil.executeSqlUpdate("delete  SYS_T_SESSION$INF t where t.session_id = ?",new Object[]{sessionId});
			String ssoid = getCookie("SSO_ID");
			if(ssoid!=null){
				DbUtil.executeSqlUpdate("delete  SYS_T_SESSION$INF t where t.session_id = ?",new Object[]{ssoid});
			}
		}
	}
	
	static String getCookie(String name){
		try {
			HttpServletRequest request = ServletActionContext.getRequest();
			Cookie[] ck = request.getCookies();
			for(Cookie c:request.getCookies()){
				if(name.equals(c.getName())){
					return c.getValue();
				}
			}
		} catch (Exception e) {
		}
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-6-24 上午11:16:43
	 * 功能描述：删除当前session中所有的值
	 * 方法的参数和返回值
	 * @param request
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("unchecked")
	static public void removeSession(HttpSession session){
		//退出后清空其他session信息，否则换用户登录后，由于不关闭浏览器，session还是同一个，有些值会仍取上一个帐号的信息
		try {
			Enumeration<String> s=session.getAttributeNames();
			while(s.hasMoreElements()){
				   String elementName = s.nextElement();
//			   System.out.println("====remove====="+elementName+":"+session.getAttribute(elementName));
				   session.setAttribute(elementName,null);
			}
		} catch (Exception e) {
		}
	}
}
